package main

import (
	"encoding/xml"
	"fmt"
	"os"
	"regexp"
	"strings"
)

type Widget struct {
	XMLName      xml.Name   `xml:"Widget"`
	Name         string     `xml:"Name,attr"`
	SkinTempName string     `xml:"SkinTempName,attr"`
	Properties   []Property `xml:"Property"`
}

type Property struct {
	Key   string `xml:"Key,attr"`
	Value string `xml:"Value,attr"`
}

// MarshalXML 重载 MarshalXML 方法
func (w Widget) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
	// 开始元素
	if err := e.EncodeToken(start); err != nil {
		return err
	}

	// 编码 Widget 的属性
	if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "Widget"}, Attr: []xml.Attr{
		{Name: xml.Name{Local: "Name"}, Value: w.Name},
		{Name: xml.Name{Local: "SkinTempName"}, Value: w.SkinTempName},
	}}); err != nil {
		return err
	}

	// 编码每个 Property
	for _, prop := range w.Properties {
		if err := e.EncodeElement(prop, xml.StartElement{Name: xml.Name{Local: "Property"}}); err != nil {
			return err
		}
	}

	// 结束 Widget 元素
	if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "Widget"}}); err != nil {
		return err
	}

	return e.EncodeToken(start.End()) // 结束外层 Widget 元素
}

//	func (p *Property) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
//		// 直接编码 Property 元素
//		return e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "Property"}, Attr: []xml.Attr{
//			{Name: xml.Name{Local: "Key"}, Value: p.Key},
//			{Name: xml.Name{Local: "Value"}, Value: p.Value},
//		}}) // 自闭合
//	}
//

// 重载 Property 的 MarshalXML 方法，以实现自闭合元素
func (p *Property) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
	// 直接编码 Property 元素
	err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "Property"}, Attr: []xml.Attr{
		{Name: xml.Name{Local: "Key"}, Value: p.Key},
		{Name: xml.Name{Local: "Value"}, Value: p.Value},
	}})
	err = e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "Property"}}) // 确保结束标签
	return err
}

func main() {
	// 创建一个 Widget 实例
	widget := Widget{
		Name:         "HomeScencePlane",
		SkinTempName: "Empty",
		Properties: []Property{
			{Key: "Pos", Value: "0 0"},
		},
	}

	// 创建 XML 文件
	file, err := os.Create("widget.xml")
	if err != nil {
		fmt.Println("Error creating file:", err)
		return
	}
	defer file.Close()

	// 使用字符串连接创建一个临时字符串
	var xmlOutput strings.Builder

	encoder := xml.NewEncoder(&xmlOutput)
	encoder.Indent("", "  ") // 设置缩进
	//// 开始编码 Widget
	//start := xml.StartElement{Name: xml.Name{Local: "Widget"}, Attr: []xml.Attr{
	//	{Name: xml.Name{Local: "Name"}, Value: widget.Name},
	//	{Name: xml.Name{Local: "SkinTempName"}, Value: widget.SkinTempName},
	//}}
	//if err := encoder.EncodeToken(start); err != nil {
	//	fmt.Println("Error encoding XML:", err)
	//	return
	//}
	//
	//// 编码每个 Property
	//for _, prop := range widget.Properties {
	//	if err := encoder.Encode(prop); err != nil {
	//		fmt.Println("Error encoding XML:", err)
	//		return
	//	}
	//}
	//
	//// 结束外层 Widget 元素
	//if err := encoder.EncodeToken(xml.EndElement{Name: xml.Name{Local: "Widget"}}); err != nil {
	//	fmt.Println("Error encoding XML:", err)
	//	return
	//}
	// 开始编码 Widget
	if err := encoder.Encode(widget); err != nil {
		fmt.Println("Error encoding XML:", err)
	}
	// 获取临时字符串
	formattedXML := xmlOutput.String()
	// 定义正则表达式，匹配 <Property> 元素
	re := regexp.MustCompile(`<Property\s+([^>]*?)>(.*?)</Property>`)

	// 替换格式
	formattedXML = re.ReplaceAllString(formattedXML, `<Property $1/>`)

	// 将格式化后的 XML 写入文件
	if _, err := file.WriteString(formattedXML); err != nil {
		fmt.Println("Error writing to file:", err)
	}
	//// 手动编码 Property，确保没有换行
	//for _, prop := range widget.Properties {
	//	if err := encoder.EncodeElement(prop, xml.StartElement{Name: xml.Name{Local: "Property"}}); err != nil {
	//		fmt.Println("Error encoding Property:", err)
	//	}
	//}
}

/*
import (
	"encoding/xml"
	"fmt"
	"os"
)

type Widget struct {
	XMLName      xml.Name   `xml:"Widget"`
	Name         string     `xml:"Name,attr"`
	SkinTempName string     `xml:"SkinTempName,attr"`
	Properties   []Property `xml:"Property"`
}

type Property struct {
	Key   string `xml:"Key,attr"`
	Value string `xml:"Value,attr"`
}

func main() {
	// 创建一个 Widget 实例
	widget := Widget{
		Name:         "HomeScencePlane",
		SkinTempName: "Empty",
		Properties: []Property{
			{Key: "Pos", Value: "0 0"},
		},
	}

	// 将 Widget 写入 XML 文件
	file, err := os.Create("widget.xml")
	if err != nil {
		fmt.Println("Error creating file:", err)
		return
	}
	defer file.Close()

	encoder := xml.NewEncoder(file)
	encoder.Indent("  ", "    ") // 设置缩进
	if err := encoder.Encode(widget); err != nil {
		fmt.Println("Error encoding XML:", err)
	}
}*/
